package com.huihe.common.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;

import javax.crypto.SecretKey;
import java.nio.charset.StandardCharsets;
import java.util.Map;

/**
 * Token工具类
 * 使用技术:JJWT
 * 文档:<a href="https://javadoc.io/static/io.jsonwebtoken/jjwt-api/0.12.5/overview-summary.html">JJWT-0.12.5 API文档</a>
 */
public class TokenUtils {

    /**
     * 令牌秘钥
     * 对应关系(Key是SecretKey时,及调用hmacShaKeyFor生成Key的时候)
     *          长度                    加密算法
     *      256 <= size <= 383^2    :   HS256
     *      384 <= size <= 511      :   HS384
     *      512 <= size             :   HS512
     */
    private final static String secret = "TDKPIRJENBZRQAEREUKRMRFFFAJZMVBOAMTUGSWFZUBERAMXAVIMNGBFTSRQKMRT";

    /**
     * 生成 Token
     * @param claims Payload部分的值
     * @return 生成的Token
     */
    public static String createToken(Map<String, Object> claims){
        //根据字符串长度设置JWT加密算法
        SecretKey key = Keys.hmacShaKeyFor(secret.getBytes(StandardCharsets.UTF_8));
        //获得时间戳
        System.currentTimeMillis();
        return Jwts.builder()
                //设置Payload
                .claims(claims)
                //设置签名
                .signWith(key)
                //生成Token
                .compact();
    }

    /**
     * 解析 Token
     * @param token 要被解析的 Token
     * @return Token的Payload部分
     */
    public static Claims parseToken(String token){
        //根据字符串长度设置JWT加密算法
        SecretKey key = Keys.hmacShaKeyFor(secret.getBytes(StandardCharsets.UTF_8));
        // 解析 JWT 并验证签名
        return Jwts.parser()
                //设置密钥
                .verifyWith(key)
                //创建JwtParser
                .build()
                //解析 JWT
                .parseSignedClaims(token)
                //获得Payload部分
                .getPayload();
    }

    /**
     * 更新 Token
     */
    public static void refreshToken(){

    }
}
